Пусть \(y_t\) одномерный временной ряд. Экспоненциальным сглаживанием на период \(t+h\), основываясь на знании значений процесса до момента времени \(t\),называется построение прогноза по переменной \(\widehat a_t\). \[\widehat{y}_{t+h}=\widehat a_t\],
Переменная \(\widehat a_t\) рекурсивно пересчитывается. \[\widehat a_t= \alpha y_t+(1-\alpha)\widehat y_t=\alpha y_t+(1-\alpha)\widehat a_{t-1}\] где \(0 < \alpha <1\) называется параметром сглаживания. Начальное значение \(\widehat a_1= y_1\). Эквивалентная запись модели прогнозирования называется error correction form: \[\widehat a_t= \widehat a_{t-1}+\alpha (y_t-\widehat a_{t-1})=\widehat a_{t-1}+ \alpha (y_t- \widehat y_t) = \widehat a_{t-1} +\alpha \epsilon_t\] Экспоненциальное сглаживание это частный случай метода Хольта-Уинтерса (Holt-Winters) для несезонных рядов без ярко выраженного тренда. Посмотрим пример прогнозирование ряда.
promData <- read.csv("c:/ShurD/aLection/PromProizv.csv")
promData <- ts(promData,start= c(1995,1),frequency = 12)
plot.ts(promData,col = "blue",lwd = 2,type = "l",main = "Prom.Proizvod.")
past <- window(promData,end = c(2005,1))
future <- window(promData,start = c(2005,2))
alpha <-0.2
model <- HoltWinters(past,alpha = alpha,beta = FALSE, gamma= FALSE)
filter(alpha*past,filter = 1-alpha,method = "recursive",init = past[1])
## Jan Feb Mar Apr May Jun Jul
## 1995 99.50000 100.74000 99.97200 99.53760 99.65008 99.48006 100.02405
## 1996 99.95515 100.86412 100.77130 98.91704 97.29363 96.35490 95.46392
## 1997 96.79765 97.93812 98.21049 96.90840 95.66672 95.65337 95.96270
## 1998 99.67110 100.75688 100.66550 98.35240 96.28192 94.42554 92.72043
## 1999 93.33148 94.94518 96.25615 98.22492 100.37993 102.86395 105.49116
## 2000 110.80084 110.56067 109.54854 109.75883 109.76706 109.51365 109.65092
## 2001 105.96000 105.48800 105.43040 105.74432 105.33546 105.16836 105.15469
## 2002 103.58418 103.60734 103.74588 103.55670 103.72536 104.54029 104.31223
## 2003 104.38588 104.84871 105.29896 105.93917 106.15134 106.34107 106.17286
## 2004 107.41053 107.24842 107.13874 106.81099 107.28879 106.71103 106.72883
## 2005 104.86482
## Aug Sep Oct Nov Dec
## 1995 100.27924 101.20339 101.18271 101.98617 100.66894
## 1996 95.27114 96.51691 96.27353 97.65882 96.84706
## 1997 96.43016 98.28413 99.18730 101.12984 100.16387
## 1998 91.27634 90.80108 90.82086 91.33669 92.58935
## 1999 108.43293 108.80634 109.62507 109.92006 110.07605
## 2000 109.16074 109.40859 109.04687 107.73750 107.25000
## 2001 104.88375 104.92700 104.88160 104.42528 103.98023
## 2002 104.54978 104.41983 103.69586 103.59669 103.85735
## 2003 106.53828 106.67063 106.75650 106.98520 107.08816
## 2004 106.08306 105.56645 105.65316 105.48253 104.80602
## 2005
pred <- predict(model,n.ahead =100)
plot(model,predicted.values = pred,lwd=2)
lines(future,col = "blue")
print(model)
## Holt-Winters exponential smoothing without trend and without seasonal component.
##
## Call:
## HoltWinters(x = past, alpha = alpha, beta = FALSE, gamma = FALSE)
##
## Smoothing parameters:
## alpha: 0.2
## beta : FALSE
## gamma: FALSE
##
## Coefficients:
## [,1]
## a 104.8648
Мы построили прогноз на 100 месяцев вперед. Понятно, что прогноз будет константой, так как модель не подразумевает тренда.
Очевидным обобщением метода является добавление тренда, начнем с линейного. Модель для прогнозирования будет теперь такой \[\widehat{y}_{t+h}=\widehat a_t+h\widehat b_t\], где пересчет параметров \(\widehat a_t,\widehat b_t\) идет уже по следующим формулам \[\widehat a_t = \alpha y_t+(1-\alpha)(\widehat a_{t-1}+\widehat b_{t-1})\] \[\widehat b_t = \beta (\widehat a_t- \widehat a_{t-1})+(1-\beta)\widehat b_{t-1}\]
past <- window(promData,end = c(2011,3))
future <- window(promData,start = c(2011,4))
model <- HoltWinters(past, gamma= FALSE)
pred <- predict(model,n.ahead =40)
plot(model,predicted.values = pred,lwd=2)
lines(future,col = "blue",lwd = 3)
print(model)
## Holt-Winters exponential smoothing with trend and without seasonal component.
##
## Call:
## HoltWinters(x = past, gamma = FALSE)
##
## Smoothing parameters:
## alpha: 0.7866934
## beta : 0.1602257
## gamma: FALSE
##
## Coefficients:
## [,1]
## a 104.6967136
## b -0.1611357
Коэффициенты \(\alpha ,\beta\) мы не задавали. Они найдены были оптимизацией в смысле минимума квадрата ошибки прогноза на один шаг вперед по первой части ряда.
Дальнейшее расширение метода это добавление аддитивной или мультипликативной сезонной компоненты с периодом сезонности \(p\).
Модель будет теперь следующего вида. \[\widehat{y}_{t+h}=\widehat a_t+h\widehat b_t+ \widehat s_t\], где пересчет параметров \(\widehat a_t,\widehat b_t,\widehat s_t\) идет уже по следующим формулам \[\widehat a_t = \alpha (y_t-\widehat s_{t-p})+(1-\alpha)(\widehat a_{t-1}+\widehat b_{t-1})\] \[\widehat b_t = \beta (\widehat a_t- \widehat a_{t-1})+(1-\beta)\widehat b_{t-1}\] \[\widehat s_t = \gamma (y_t-\widehat a_t)+(1-\gamma)\widehat s_{t-p}\]
Модель будет теперь следующего вида. \[\widehat{y}_{t+h}=(\widehat a_t+h\widehat b_t)\widehat s_t\], где пересчет параметров \(\widehat a_t,\widehat b_t,\widehat s_t\) идет уже по следующим формулам \[\widehat a_t = \alpha (y_t-\widehat s_{t-p})+(1-\alpha)(\widehat a_{t-1}+\widehat b_{t-1})\] \[\widehat b_t = \beta (\widehat a_t- \widehat a_{t-1})+(1-\beta)\widehat b_{t-1}\] \[\widehat s_t = \gamma (y_t/\widehat a_t)+(1-\gamma)\widehat s_{t-p}\]
Числовой пример рассмотрим на примере ряда импорта России из прошлой лекции
import <- read.csv("c:/ShurD/Alection/import.csv", header = TRUE)
importFact <- ts(import$Fact ,start= c(1997,1),frequency =12)
plot(importFact ,type = "l", col = "blue",lwd = 2,main = "Import (mlrd dollar).Russia")
Начнем прогнозирование с января 2011 года на 5 лет вперед или на 12*5 = 60 месяцев вперед. Модель будем брать мультипликативную.
past <- window(importFact,end = c(2011,1))
future <- window(importFact,start = c(2011,2))
model <- HoltWinters(past,seasonal = "mult")
pred <- predict(model,n.ahead =60)
plot(model,predicted.values = pred,lwd=2)
lines(future,col = "blue",lwd = 3)
print(model)
## Holt-Winters exponential smoothing with trend and multiplicative seasonal component.
##
## Call:
## HoltWinters(x = past, seasonal = "mult")
##
## Smoothing parameters:
## alpha: 0.6389659
## beta : 0.01602396
## gamma: 0.8568556
##
## Coefficients:
## [,1]
## a 24.4933554
## b 0.1761019
## s1 0.8849390
## s2 1.0279983
## s3 1.0611034
## s4 1.0875641
## s5 1.1375211
## s6 1.1930511
## s7 1.2343608
## s8 1.1516480
## s9 1.1371452
## s10 1.0515990
## s11 1.1456385
## s12 0.6530003
2012 год спрогнозировали неплохо, а потом запахло новым кризисом:нефть стала падать,в 2015 году Украина, “Крым наш”, санкции ввели, нефть совсем упала и т.д.. Вывод. Прогнозировать на большой период имеет смысл только при неизменной динамике ряда.
Помочь увидеть недостатки и понять область применимости метода Хольта-Уинтерса поможет следующий фрейм
Чаще всего построение параметрической модели временных рядов вызвано желанием успешного прогнозирования будущих значений.В этом разделе будем предполагать, что модель уже известна.
Через \(\hat{y}_t(l)\) будем обозначать прогноз,сделанный в момент времени \(t\) на \(l\) интервалов времени вперед, а \(y_{t+l}\) истинное значение временного ряда, которое он примет в будущем через \(l\) интервалов времени после \(t\).
\(\hat y_{t}\) можно выразить как линейную функцию от предшествующих значений белого шума \(\epsilon_t,\epsilon_{t-1},....\)
Пусть наилучшим является прогноз вида \(\hat y_{t}(l)=\Psi_{l}^{∗}\epsilon_{t}+\Psi_{l+1}^{∗}\epsilon_{t-1}+\Psi_{l+2}^{∗}\epsilon_{t-2}+...=\sum_{j=0}^{∞}\Psi_{l+j}^{∗}\epsilon_{t-j}\)
где веса \(\Psi_{l}^{∗},\Psi_{l+1}^{∗},\Psi_{l+2}^{∗},..\) пока неизвестны их необходимо определить. Тогда так как
\(y_{t+l}=\sum_{j=-∞}^{t+l}\Psi_{t+l-j}\epsilon_{j}=\sum_{j=0}^{∞}\Psi_{j}\epsilon_{t+l-j}\)
Вычислим математическое ожидание квадрата ошибки прогноза
\(E[y_{t+l}-\hat y_{t}(l)]^2=\sigma_{\epsilon}^2(1+\Psi_1^2+...+\Psi_{l-1}^2)+\sigma_{\epsilon}^2\sum_{j=0}^{∞}(\Psi_{l+j}-\Psi_{l+j}^{∗})^2\)
Оба слагаемых в правой части последнего выражения положительны. Второе слагаемое можно сделать нулем если положить \(\Psi_{l+j}=\Psi_{l+j}^{∗}\) Таким образом при \(\Psi_{l+j}=\Psi_{l+j}^{∗}\) математиматическое ожидание квадрата ошибки минимально. Так мы доказали частный случай важного свойства условного математического ожидания
Условное математическое ожидание \(\mathbb{E}[X \mid \mathcal{G}]\) — это наилучшее средне-квадратичное приближение \(X \mathcal{G}\)-измеримыми случайными величинами:
\(\|X - \mathbb{E}[X\mid \mathcal{G}]\| = \inf\limits_{Z \in L^2_{\mathcal{G}}} \|X - Z\|\)
См. свойства условного математического ожидания например здесь https://ru.wikipedia.org/wiki/%D0%A3%D1%81%D0%BB%D0%BE%D0%B2%D0%BD%D0%BE%D0%B5_%D0%BC%D0%B0%D1%82%D0%B5%D0%BC%D0%B0%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B5_%D0%BE%D0%B6%D0%B8%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5 Итак
\(\hat y_t(l)=E[y_{t+l}|y_1,..y_t]\) - наилучший в смысле среднего квадрата ошибки прогноз. Вычислением и изучением свойст прогноза мы и будем заниматься в этой лекции для различных моделей.
Пусть модель временного ряда
\(y_t=\mu_t+x_t\)
где случайная компонента \(x_t\) имеет среднее 0, а \(\mu_t\)- детерминированный тренд
\(\hat y_t(l)=E[\mu_{t+l}+X_{t+l}|y_1,..y_t]=E[\mu_{t+l}|y_1,..y_t]+E[x_{t+l}|y_1,..y_t]=\mu_{t+l}+E[x_{t+l}]=\mu_{t+l}\)
так как при \(l>1\) \(x_{t+l}\) не зависит от \(y_1,..y_t\) и имеет среднее 0
В частности для линейного тренда \(\mu_t=\beta_0+\beta_1t\) имеем прогноз
\(\hat y_t(l)= \beta_0+\beta_1(t+l)\)
Для сезонной модели \(\mu_t=\mu_{t+12}\)
\(\hat y_t(l)= \mu_{t+12+l}\)
Ошибка прогноза \(e_t(l)= y_{t+l}-\hat y_t(l)= \mu_{t+l}+x_{t+l}-\mu_{t+l}= x_{t+l}\)
Отсюда \(E[e_t(l)]=E[x_{t+l}]= 0\) и \(D[e_t(l)]= c_0 = D[x_t]\)
На примере AR(1) модели с константой
\(y_t-\mu=\phi(y_{t-1}-\mu)+\epsilon_t\)
Заменим \(t\) на \(t+1\)
\(y_{t+1}-\mu=\phi(y_{t}-\mu)+\epsilon_{t+1}\)
возьмем условное матеиатическое ожидание от обеих частей
\(\hat y_t(1)-\mu = \phi[E(y_t|y_1,...,y_t)-\mu]+[E(\epsilon_{t+1}|y_1,...,y_t)\)
Отсюда
\(\hat y_t(1)=\mu+\phi(y_t-\mu)\)
Для произвольного \(l\)
\(\hat y_t(l)=\mu+\phi(\hat y_t(l-1)-\mu)\) для \(l >=1\)
Последнее можно переписать так
\(\hat y_t(l)=\mu+\phi^{l-1}(\hat y_t(1)-\mu)\) для \(l >=1\)
или
\(\hat y_t(l)=\mu+\phi^{l}(y_t-\mu)\)
Посмотрим ошибку при прогнозировании
\(e_t(1)=y_{t+1}-\hat{y}_t(1)= \phi(y_t-\mu)+\mu+\epsilon_{t+1}-\phi(y_t-\mu)+\mu= \epsilon_{t+1}\)
Отсюда дисперсия ошибки прогноза
\(D[e_t(1)]=\sigma_{\epsilon}^2\)
Ошибка прогноза на \(l\) интервалов времени
\(e_t(l)=y_{t+l}-\hat{y}_t(l1)=\epsilon_{t+l}+\phi\epsilon_{t+l-1}+...+\phi^{l-1}\epsilon_{t+1}\)
Но для модели AR(1) \(\Psi_k= \phi^k\) поэтому
\(e_t(l)=\epsilon_{t+l}+\Psi_1\epsilon_{t+l-1}+...+\Psi_{l-1}\epsilon_{t+1}\)
следовательно дисперсия ошибки прогноза на \(l\) интервалов
\(D[e_t(l)]= \sigma_{\epsilon}^2(1+\Psi_1^2+...+\Psi_{l-1}^2)=\sigma_{\epsilon}^2\frac{1-\phi^{2l}}{1-\phi^2}\)
Модель
\(y_t=\mu+\epsilon_t-\theta\epsilon_{t-1}\)
Меняем \(t\) на \(t+1\) и ,беря условное математическое ожидание от обеих часте, получим
\(\hat{y}_t(1)= \mu-\theta E[\epsilon_t|y_1,...,y_t]=\mu-\theta\epsilon_t\)
Откуда ошибка прогноза
\(e_t(1)=y_{t+1}-\hat{y}_t(1)= (\mu+\epsilon_{t+1}-\theta\epsilon_{t})- (\mu-\theta\epsilon_t)= \epsilon_{t+1}\)
Для произвольного числа прогнозов
\(\hat{y}_t(l)= \mu+ E[\epsilon_{t+l}|y_1,...,y_t]- \theta E(\epsilon_{t+l-1}|y_1,...,y_t)=\mu\) для всех\(l>1\)
Для MA(1) модели \(\Psi_1=-\theta\) и \(\Psi_j=0\) при \(j>1\) и формула
\(D[e_t(l)]= \sigma_{\epsilon}^2(1+\Psi_1^2+...+\Psi_{l-1}^2)\)
также справедлива.
Для модели произвольного порядка уравнение для прогнозирования
\(\hat{y}_t(l)= \phi_1\hat{y}_{t-1}+\phi_2\hat{y}_{t-2}+...+\phi_p\hat{y}_{t-p}+\theta_0-\theta_1E(\epsilon_{t+l-1}|y_1,...,y_t)-\theta_2E(\epsilon_{t+l-2}|y_1,...,y_t)-...--\theta_qE(\epsilon_{t+l-q}|y_1,...,y_t)\)
где
\(E(\epsilon_{t+j}|y_1,...,y_t)= 0\) при \(j>0\)
\(E(\epsilon_{t+j}|y_1,...,y_t)= \epsilon_{t+j}\) при \(j\le 0\)
Заметим, что для \(j>0\) это будет прогноз \(\y_{t}(j)\), а для \(j\le 0\) это известное уже значение \(\hat{y}_(j)= y_{t+j}\)
Немного сложнее, но также можно показать, что дисперсии ошибок справедливо соотношение
\(D[e_t(l)]= \sigma_{\epsilon}^2(1+\Psi_1^2+...+\Psi_{l-1}^2)\)
Здесь и понадобится выражение для дисперсии ошибок, полученное в предыдущих разделах
\(D[e_t(l)]= \sigma_{\epsilon}^2(1+\Psi_1^2+...+\Psi_{l-1}^2)\) (*)
Типичным предположением относительно распределения белого шума это нормальность. На практике \(\sigma_\epsilon^2\) неизвестна и должна быть оцененена из рассматриваемого временного ряда. Пусть порядки ARMA модели \(p\) и \(q\) определены правильно.Предположим, что ряд стационарен. Одним из рассмотренных ранее методом произведем оценку параметров модели \[\phi_1,...\phi_p,\theta_1,...,\theta_q\] и \(\sigma_\epsilon^2\). Для нахождения доверительного интервала с использованием формулы для дисперсии необходимо определить веса \(\Psi_k, k=1,...l-1\). Это мы ранее сделали, для моделей AR(1) и МА(1) в явном виде. Для произвольной модели ARMA(p,q) это можно сделать численно. Имеем модель \[\phi_p(B)y_t = \theta_q(B)\epsilon_t\]. Где \[\phi_p(B)= 1- \phi_1 B- ...- \phi_p B^p\] , а \[\theta_q(B)=1-\theta_1 B-...-\theta_qB^q\] Реализовав численный алгоритм деления полиномов \[\frac{\phi_p(B)}{\theta_q(B)}\], найдем необходимые веса \(\Psi_k, k=1,...l-1\). Таким образом дисперсия прогноза на \(l\) интервалов нам известна это формула (*). Для заданного уровня доверия \((1-\alpha)100\)% определим квантиль \(z_{1-\alpha/2}\) стандартного нормально распределения с нулевым математическим ожиданием и дисперсией 1, тогда доверительный интервал для прогноза \(\hat y_t(l)\) будет
\(\hat y_t(l)\pm z_{1-\alpha/2}\sqrt{D[e_t(l)]}\)
Смоделируем ARMA(2,1) модель
\((1-\phi_1B-\Phi_2B^2)y_t= (1-\theta_1B)\epsilon_t\)
phi1 <- 0.4
phi2 <- -0.5
theta1 <- 0.4
sigma <- 4
model <- list(ar = c(phi1,phi2) ,ma = theta1)
arma21 <- arima.sim(model=model,n = 100,innov=rnorm(100,0,sd=sigma))
matplot(arma21,lwd=2,type="l",col="blue",main="Simulated Time Series")
Произведем оценку модели методом максимального правдоподобия
library(TSA)
## Loading required package: leaps
## Loading required package: locfit
## locfit 1.5-9.1 2013-03-22
## Loading required package: mgcv
## Loading required package: nlme
## This is mgcv 1.8-9. For overview type 'help("mgcv-package")'.
## Loading required package: tseries
##
## Attaching package: 'TSA'
## The following objects are masked from 'package:stats':
##
## acf, arima
## The following object is masked from 'package:utils':
##
## tar
data(arma21)
## Warning in data(arma21): data set 'arma21' not found
mod21 <- arima(arma21,order = c(2,0,1))
mod21$coef
## ar1 ar2 ma1 intercept
## 0.4544221 -0.5834244 0.1286499 0.1018173
mod21$sigma2
## [1] 14.78368
Построим прогноз и 95% доверительные интервалы
plot(mod21,n.ahead=12,type='b',xlab='Time',col="blue",lty=3,n1=length(arma21)-20,lwd=1)
abline(h=coef(mod21)[names(coef(mod21))=='intercept'])
Значения прогнозов \(\hat y_t(l)\) и стандартное отклонение прогнозов \(\sqrt{D[e_{t+l}]}\) можно вычислить для все \(l\) c помошью метода predict(). Доверительные интервала любого заданного уровня \((1-\alpha)100\)% можно вычислить , используя квантиль нормального распределения и стандартное отклонение прогнозов \(\sqrt{D[e_{t+l}]}\)
forec<-predict(mod21,n.ahead = 10)
forecpl <- forec$pred+forec$se
forecmn <- forec$pred-forec$se
ff <-cbind(forec$pred,forecpl,forecmn)
matplot(ff,lty= 1,type = "l",lwd = 2,main = "Forecasts +- std value" )
При прогнозировании нестационарного ряда, который сводится к стационарному операцией дифференцирования (метод diff(.)), прогнозируйте сначала стационарный ряд, затем применяйте к прогнозам обратный к дифференцированию оператор суммирования (метод diffinv(.))
Следующий фрейм есть пример прогнозирования смоделированного ряда. Попробуйте разную длину прогноза по истории ряда.
В прошлой лекции мы построили сезонную ARMA модель для импорта России. Здесь мы посмотрим на его прогнозирование. Сначала повторим построение лучшей модели из прошлой лекции без лишних комментариев. И к ряду из разностей и сезонных разностей, взятых с мая 2006 года по настоящее время подгоним сезонную SARMA(0,0,3)(0,0,1) модель.
y <- diff(importFact)
z <- diff(y,lag = 12)
zz <- z[100:216]
zz <- ts(zz,start= c(2006,5),frequency = 12 )
plot(zz ,type = "l", col = "blue",lwd = 2,main = "Import (mlrd dollar).Russia.Seasonal Differences")
zz <- zz[1:116]
modelimport2 <- arima(zz,order = c(0,0,3),seasonal = list(order= c(0,0,1),period = 12 ),method = "ML")
Как и в прошлом примере построим прогноз на 12 месяцев вперед. Добавим к нему прошлые значения и доверительные интервалы уровня 0.8
getVector <- function(vv,bInd,l)
{
c <- vector()
if (bInd > 1)
{
c <- rep(NA,bInd-1)
}
res <- c(c,vv)
cc <- vector()
cc <- rep(NA,l-length(res))
res <- c(res,cc)
return(res)
}
lzz <- length(zz)
nforec <- 12
ll <- lzz+nforec
forecImport<-predict(modelimport2,n.ahead = nforec)
vec1 <- getVector(zz,1,ll)
vec2 <- getVector(forecImport$pred,lzz+1,ll)
vec3 <- getVector(zz,1,ll)
q<- qnorm(0.75,0,1)
dPl <- forecImport$pred + forecImport$se*q
dMn <- forecImport$pred - forecImport$se*q
vec4 <- getVector(dPl,lzz+1,ll)
vec5 <- getVector(dMn,lzz+1,ll)
res <- cbind(vec1,vec2,vec3,vec4,vec5)
matplot(res , type = c("b","b","b","b","b"),pch = 16,lty=1, lwd= c(2,3,2,1,1),ylab = "Values",xlab="Time",col = c("green","blue","magenta","black","black"))
abline(h=coef(modelimport2)[names(coef(modelimport2))=='intercept'])
legend("topright",c("Future Values","Forecasts","Time series","Conf.Level"),bty="n",lwd = 2,col = c("green","blue","magenta","black"))
Мы получили прогноз на два года ряда из разностей. Вернемся к исходным значениям взяв обратный к сезонным разностям оператор diffinv. В качестве начальных условий возьмем первые 12 значений из ряда \[y_t=import_t-import_{t-1}\]. Проинтегрируем также доверительные интервалы и такими же начальными условиями.
firsty <- y[1:12]
iiy <- c(z,forecImport$pred)
iPl <- c(z,dPl)
iMn <- c(z,dMn)
iforec <- diffinv(iiy,lag= 12,differences = 1,firsty)
iforecPl <- diffinv(iPl,lag= 12,differences = 1,firsty)
iforecMn <- diffinv(iMn,lag= 12,differences = 1,firsty)
Теперь проинтегрируем уже несезонные разности с начальным значением равным первому значению ряда импорта.
firstImport <-importFact[1]
imforec <- diffinv(iforec,lag= 1,differences = 1,firstImport)
imforecPl <- diffinv(iforecPl,lag= 1,differences = 1,firstImport)
imforecMn <- diffinv(iforecMn,lag= 1,differences = 1,firstImport)
imforec <- ts(imforec,start = c(1997,1),frequency = 12)
imforecPl <- ts(imforecPl,start = c(1997,1),frequency = 12)
imforecMn <- ts(imforecMn,start = c(1997,1),frequency = 12)
imforecPl[1:length(importFact)]= NA
imforecMn[1:length(importFact)]= NA
plot(imforec,col = "blue",lwd = 2,type = "l", main = "Import Russia Forecasts and Conf.Interval" )
lines(importFact,lwd = 2,col = "red")
lines(imforecPl,lwd = 2,lty = 4,col = "black")
lines(imforecMn,lwd = 2,lty = 4,col = "black")
Увидеть результаты прогнозирования для произвольного момента времени можно в следующем фрейму